#include <iostream>
#include <sstream>
#include <string>
#include <memory>
#include <jsoncpp/json/json.h>

using namespace std;

int main()
{
    string name = "张三";
    int age = 17;
    float scores[] = {66, 66.66, 88.8};

    Json::Value in;

    in["姓名"] = name;
    in["年龄"] = age;

    for(int i = 0; i < 3; i++)
        in["成绩"].append(scores[i]);

    // 序列化

    // // 低版本写法
    // cout << Json::FastWriter().write(in) << endl; // 简单序列化
    // cout << Json::StyledWriter().write(in) << endl; // 格式化序列化

    // 高版本写法
    Json::StreamWriterBuilder swb;
    shared_ptr<Json::StreamWriter> sw(swb.newStreamWriter()); // 创建一个序列化对象

    ostringstream ss;
    sw->write(in, &ss); // 序列化

    cout << ss.str() << endl;


    // 反序列化

    Json::Value out;
    string outStr = R"({ "姓名":"李四", "年龄":20, "成绩":[25.6, 45.8, 66.7]})";

    // // 低版本写法，存在安全问题
    // Json::Reader().parse(outStr, out);

    // 高版本写法
    Json::CharReaderBuilder crb;
    shared_ptr<Json::CharReader> cr(crb.newCharReader());


    string err;
    cr->parse(outStr.c_str(), outStr.c_str() + outStr.size(), &out, &err);

    name = out["姓名"].asString();
    age = out["年龄"].asInt();
    for(int i = 0; i < out["成绩"].size(); i++)
        scores[i] = out["成绩"][i].asFloat();
    cout << name << endl;
    cout << age << endl;
    for(int i = 0; i < 3; i++)
        cout <<scores[i] << " ";
    cout << endl;

    return 0;
}